package main

import (
	"fmt"
	"os"
	"path"
)

// 仅作为一种接口函数描述
type IFile interface {
	SetPath(path string)
	GetPath() string
	GetFileName() string
	GetFileExt() string
	GetFileSize() int64
	GetFileExists() bool

	// GetRealPath() string
	// GetAbsPath() string
}

type File struct {
	path string
}

func NewFile(path string) *File {
	// var f = &File{}

	return &File{
		path: path,
	}
}
func (f *File) SetPath(path string) {
	f.path = path
}
func (f *File) GetPath() string {
	return f.path
}
func (f *File) GetFileName() string {
	return path.Base(f.path)
}
func (f *File) GetFileExt() string {
	return path.Ext(f.path)
}

func (f *File) GetFileExists() bool {
	if _, err := os.Stat(f.path); os.IsNotExist(err) {
		return false
	}
	return true
}

func (f *File) GetFileSize() int64 {
	if !f.GetFileExists() {
		return 0
	}

	fp, _ := os.Open(f.path)
	size, err := fp.Seek(0, os.SEEK_END)
	if err != nil {
		fmt.Printf("File Size Error: %v\n", err.Error())
		info, err := os.Stat(f.path)
		if err != nil {
			fmt.Printf("File Stat Error: %v\n", err.Error())
			return 0
		}
		return info.Size()
	}
	return int64(size)
}

func main() {
	// var f *File = NewFile(os.Args[0])
	file := NewFile(os.Args[0])

	fmt.Printf("%v: Not Found Argument.\n", path.Base(os.Args[0]))

	fmt.Println("GetPath: ", file.GetPath())
	fmt.Println("FileName: ", file.GetFileName())
	fmt.Println("FileExt: ", file.GetFileExt())
	fmt.Println("FileSize: ", file.GetFileSize())
	fmt.Println("FileExists: ", file.GetFileExists())
}
